Tengo una API que valida y crea usuario. Cuando no escribo el correo electrónico en el cuerpo de la solicitud, recibo
{ "timestamp": "2020-11-26T13:55:40.116+00:00", "status": 400, "error": "Bad Request", "message": "Validation failed for object='user'. Error count: 1", "path": "/api/users" }Quiero cambiar el mensaje a un error más comprensible como "el correo electrónico no debe ser nulo". Así es como se ve la propiedad de mi modelo:
@NotNull private String email;Y aquí está el método de mi controlador:
@PostMapping("/users") public ResponseEntity<User> addUser(@RequestBody @Valid User user) { User savedUser = manager.save(user); URI uri = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") .buildAndExpand(savedUser.getId()) .toUri(); return ResponseEntity.ok(savedUser); } Intenté establecer un mensaje personalizado en la anotación @NotNull , pero el mensaje no cambia. Además, cuando se lanza el error, la consola muestra este mensaje:
2020-11-26 15:09:11.460 WARN 7137 --- [nio-8080-exec-2] .wsmsDefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<pl.vemu.socialApp.entities.User> pl.vemu.socialApp.controllers.UserController.addUser(pl.vemu.socialApp.entities.User) throws pl.vemu.socialApp.exceptions.user.UserWithEmailAlreadyExistException: [Field error in object 'user' on field 'email': rejected value [xsars.pl]; codes [Email.user.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.email,email]; arguments []; default message [email],[Ljavax.validation.constraints.Pattern$Flag;@2a50b33,.*]; default message [must be a well-formed email address]] ] ¿Cómo configurar el mensaje en respuesta json?
¿Cómo deshacerse de este mensaje en la consola? Otros errores no muestran mensajes en la consola.
El problema es que Spring, de forma predeterminada, no envía errores mientras se vincula. Para habilitarlo, debe agregar server.error.include-binding-errors=always en su aplicación.propiedades.
En lugar de confiar en la propiedad "message" , puede usar la propiedad "defaultMessage" .
Puede establecer un mensaje de error personalizado en la anotación @NotNull .
@NotNull(message = "Name cannot be null") private String name; @NotNull(message = "email cannot be null") @NotEmpty(message = "email cannot be empty") private String email; Si falla la validación de un campo, spring establecerá estos mensajes personalizados en la propiedad "defaultMessage"
Como dijiste en los comentarios que no pudiste encontrar defaultMessage, otro enfoque (quizás el enfoque sucio) sería crear manualmente el cuerpo de la respuesta, puedes consultar el siguiente código de muestra para construirlo:
@PostMapping("saveEmployee") public ResponseEntity<?> eat(@RequestBody @Valid Employee employee, Errors errors) { if (errors.hasFieldErrors()) { FieldError fieldError = errors.getFieldError(); return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(fieldError.getDefaultMessage()); } return ResponseEntity.ok(employee); } FieldError#getDefaultMessage() expondrá el valor del atributo del message en @NotNull(message = "email can't be null")
ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body("email must be not null"); y reemplace HttpStatus.UNPROCESSABLE_ENTITY con un código de error adecuado.